【VFX】銃の弾丸エフェクトを World Position で制御する

November 28, 2022


銃から発射される弾丸のエフェクトをVFXで作成している中で

  • マズルフラッシュ

  • 弾丸

の2エフェクトを一つのVFX内で再現できないかを考え、そのままマズルフラッシュと弾丸を紐づけてみました

(最終的なノード↓) B7CB58519726CEE4B7C20726C739ADDC

左がマズルフラッシュのエフェクト、右側が弾丸エフェクト。 マズルフラッシュが再生された時に弾丸エフェクトも再生される形です

ここで弾丸はInitialize Particleノードの Set Velocity ブロックにより、Z方向に向けて速度が加算されて前方へ進んでいきます

これを以下モデルの銃の先につけてみます

BB678698E422899B016A84CF5294D8C0

76B5DA7D5A7B6719DA831305F9BC9BE4

再生すると、マズル先から銃が発射されたようになります

ただ、問題なのがMuzzleの子Objectの場合、親が移動、回転されるとVFXEffectも影響を受けてしまいます

今回の銃エフェクトは発射されたら親の影響を受けたくないです

そもそもエフェクトの親をMuzzleと切り離すのも手ですが、もう一つ簡単な方法として VFX 内の座標系を親の影響を受けないようにWorldに変化させます。

座標系切り替え

各ノードの右上に Local と書かれている文字をクリックして World に変化させます

098F34C972E15C037A987CD5B9DA47C4

ここでエフェクトに与える座標系を変更させます。

この状態で再生すると以下

親の影響を受けなくなりましたが、その代わりマズルエフェクトと弾丸エフェクトの位置がずれています。

親の影響を受けなくなった = 再生時の座標、回転 も影響受けない ため。

これでは実装上めんどくさいため、各 Initialize Particle ノード に **SetPosition **を追加します。 ここで 座標系は Local にしておきます。

84652AB0C6BF799AC1410EAB4C6C1BB0

この場合、パーティクル生成時はLocal座標系の (0, 0, 0) で配置されますが、その後はWorld空間で処理されます

これで実装した結果が以下

マズル(親) の位置にエフェクトが再生されます

そして親の座標系によらないため銃を回転させても影響を受けなくなりました

しかしまだ問題があります。 銃を回転させた状態でエフェクトを再生させた場合、座標が必ずZ軸固定になってしまいました

回転も親の影響を受けないからです

Set Position と同じく、Set Angle にも Local, World の切り替えがあるかと思ったのですが特に見当たりませんでした

設定を見直します。

まず、VelocityはマズルのZ軸方向に向いて飛んでいくように Transform(Vector) ブロックを利用します

Transform (W) に対し、BulletSpeed を Z 方向のみに設定することで、マズルのZ方向にVelocityが働くようにしました。

01026A6FBEA50A9A356E1551DA478974

そして弾丸のOutputには Orient: Along Velocity をアタッチします ※ドキュメント https://docs.unity3d.com/Packages/com.unity.visualeffectgraph@11.0/manual/Block-Orient.html

このブロックによりパーティクルがVelocityの方角を正面とするようになります。 つまり弾丸の Velocity(マズルのZ軸) に向かいパーティクルの向きが決まるため弾丸の回転も正しくなります

567F25883A7F41F1C2300FE6F3FCDB56

以上の設定でパーティクルの回転軸も問題なくなりました

参考

https://forum.unity.com/threads/world-space-issues.862549/

https://forum.unity.com/threads/how-do-i-keep-particle-local-angle.1107233/

https://docs.unity3d.com/ja/Packages/com.unity.visualeffectgraph@10.7/manual/Block-Orient.html tml)